package com.mmy.service.scenic.impl;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.ResourceLoader;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import com.alibaba.fastjson.JSONObject;
import com.mmy.controller.FileNameUtils;
import com.mmy.controller.UtilConstants;
import com.mmy.dao.constzone.TConstZoneRepository;
import com.mmy.dao.scenic.TScenicBaseRepository;
import com.mmy.dao.scenic.TScenicPlanRepository;
import com.mmy.dao.scenic.VScenicBaseRepository;
import com.mmy.dao.scenic.VScenicOrderRepository;
import com.mmy.domain.scenic.TScenicBase;
import com.mmy.domain.scenic.VScenicBase;
import com.mmy.domain.scenic.VScenicOrder;
import com.mmy.domain.sys.TSysUser;
import com.mmy.mapper.ScenicDao;
import com.mmy.service.ServiceCommon;
import com.mmy.service.scenic.ScenicBaseService;

@Service
public class ScenicBaseServiceImpl implements ScenicBaseService {
	@Autowired
	TScenicBaseRepository tScenicBaseRepository;
	@Autowired
	VScenicBaseRepository vScenicBaseRepository;
	@Autowired
	ServiceCommon common;
	@Autowired
	VScenicOrderRepository vScenicOrderRepository;
	@Autowired
	TScenicPlanRepository tScenicPlanRepository;
	@Autowired
	private TConstZoneRepository tConstZoneRepository;
	private final ResourceLoader resourceLoader;
	
	@Autowired
	public ScenicBaseServiceImpl(ResourceLoader resourceLoader) {
		this.resourceLoader = resourceLoader;
	}

	@Value("${web.upload-path}")
	private String path;
	
	@Autowired
	private ScenicDao scenicDao;
	
	/**
	 * 获取最大值
	 * 
	 * @return 返回值说明 最大ID
	 * @author 创建人 dingxd
	 * @date 创建日期 2020.11.17
	 */
	public int getMaxScenicID() {
		// 流水号
		Object objCode = tScenicBaseRepository.getMaxScenicID();
		int iID = 0;
		if (objCode != null) {
			iID = Integer.parseInt(objCode.toString());
		}
		return iID;
	}

	/**
	 * 函数功能说明： 进入后台景区电子票信息页面查询景点信息
	 *
	 * @return 返回值说明 jsp页面
	 * @throws 异常处理说明
	 * @author 创建人 hanxl
	 * @param strScenicName
	 * @param pageSize
	 * @param pageNumber
	 * @date 创建日期 2020.12.24
	 */
	public List<VScenicBase> findByOrgID(String pageNumber, String pageSize, String strScenicName,
			String strScenicContact, String strScenicTel, String strProvinceID, String strCityID, String strZoneID,
			TSysUser sessionSysUser) {
		int iPageSize = 0;
		int iTempPageNo = 0;

		if (strScenicName == null) {
			strScenicName = "";
		}
		if (strScenicContact == null) {
			strScenicContact = "";
		}
		if (strScenicTel == null) {
			strScenicTel = "";
		}
		if (strProvinceID == null) {
			strProvinceID = "";
		}
		if (strCityID == null) {
			strCityID = "";
		}
		if (strZoneID == null) {
			strZoneID = "";
		}
		if (pageNumber == null) {
			pageNumber = "1";
		}
		if (pageSize == null) {
			iPageSize = 20;
		} else {
			iPageSize = Integer.valueOf(pageSize);
			iTempPageNo = (Integer.valueOf(pageNumber) - 1) * iPageSize;
		}
		int iOrgID = sessionSysUser.getOrgID();
		// 预留字段1 改为OrgID
		// 判断登录人 如果为超级管理员 查询所有 如果为其他有权限的员工只能查看到自己公司的景点信息
		List<VScenicBase> lstScenicBase = new ArrayList<VScenicBase>();
		if (sessionSysUser.getUserID() == 0) {
			lstScenicBase = vScenicBaseRepository.findAll(strScenicName, strScenicContact, strScenicTel, strProvinceID,
					strCityID, strZoneID, iTempPageNo, iPageSize);
		} else {
			lstScenicBase = vScenicBaseRepository.findByOrgID(strScenicName, iOrgID, strScenicContact, strScenicTel,
					strProvinceID, strCityID, strZoneID, iTempPageNo, iPageSize);
		}
		return lstScenicBase;
	}

	/**
	 * 函数功能说明： 进入后台景区电子票信息页面查询景点信息 分页
	 *
	 * @return 返回值说明 jsp页面
	 * @throws 异常处理说明
	 * @author 创建人 hanxl
	 * @param strScenicName
	 * @param pageSize
	 * @param pageNumber
	 * @date 创建日期 2020.12.24
	 */
	public HashMap<String, Integer> mapScenicBase(String pageNumber, String pageSize, String strScenicName,
			String strScenicContact, String strScenicTel, String strProvinceID, String strCityID, String strZoneID,
			TSysUser sessionSysUser) {
		if (strScenicName == null) {
			strScenicName = "";
		}
		if (strScenicContact == null) {
			strScenicContact = "";
		}
		if (strScenicTel == null) {
			strScenicTel = "";
		}
		if (strProvinceID == null) {
			strProvinceID = "";
		}
		if (strCityID == null) {
			strCityID = "";
		}
		if (strZoneID == null) {
			strZoneID = "";
		}
		int iOrgID = sessionSysUser.getOrgID();
		HashMap<String, Integer> mapPage = new HashMap<String, Integer>();
		if (sessionSysUser.getUserID() == 0) {
			mapPage = common.getPage(pageNumber, pageSize, vScenicBaseRepository.countALL(strScenicName,
					strScenicContact, strScenicTel, strProvinceID, strCityID, strZoneID));
		} else {
			mapPage = common.getPage(pageNumber, pageSize, vScenicBaseRepository.countByOrgID(strScenicName, iOrgID,
					strScenicContact, strScenicTel, strProvinceID, strCityID, strZoneID));
		}
		return mapPage;
	}

	/**
	 * 函数功能说明： 进入后台景区电子票信息页面查询景点详情信息
	 *
	 * @return 返回值说明 jsp页面
	 * @throws 异常处理说明
	 * @author 创建人 hanxl
	 * @date 创建日期 2020.12.24
	 */
	public VScenicBase findByScenicID(String strScenicID) {
		int iScenicID = Integer.valueOf(strScenicID);
		return vScenicBaseRepository.findByScenicID(iScenicID);
	}

	/**
	 * 函数功能说明： 新建景点信息
	 *
	 * @param 参数说明
	 * @return 返回值说明 jsp页面
	 * @throws 异常处理说明
	 * @author 创建人 hanxl
	 * @date 创建日期2020.12.24
	 */
	public boolean createScenicBase(TScenicBase tScenicBase, MultipartFile fScenicImg, TSysUser sessionSysUser) {
		// 查重
		// 根据景点名称和区域ZoneID判断
		// 如果景点名称相同且区域相同则不能创建
		List<TScenicBase> lstScenicBase = tScenicBaseRepository.findByScenicName(tScenicBase.getScenicName(),
				tScenicBase.getZoneID());
		if (lstScenicBase.size() == 0) {
			tScenicBase.setScenicID(common.createBaseCode(UtilConstants.TableName.T_SCENIC_BASE));
			// 1.定义上传的文件
			String localPath = path;
			if (fScenicImg != null) {
				// 2.获得文件名字
				String scenicName = fScenicImg.getOriginalFilename();

				// 3.上传
				String newScenicName = FileNameUtils.getFileName(scenicName);

				// 3.1 生成新的文件名
				String realScenicPath = localPath + "/" + newScenicName;

				// 3.2 保存文件
				File destPhoto = new File(realScenicPath);

				// 判断文件目目录是否存在,不存在则新建
				if (!destPhoto.getParentFile().exists()) {
					destPhoto.getParentFile().mkdir();
				}

				try {
					fScenicImg.transferTo(destPhoto);

				} catch (IllegalStateException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				tScenicBase.setImgPath(newScenicName);
			}

			// 创建所属公司ID 实体类为String类型 需要转化一下 hanxl 2020.11.19
			tScenicBase.setSpare1(String.valueOf(sessionSysUser.getOrgID()));
			tScenicBase.setCreateDate(new Date());
			tScenicBase.setCreator(sessionSysUser.getUserName());
			tScenicBaseRepository.save(tScenicBase.getScenicID());
			tScenicBaseRepository.save(tScenicBase);
			return true;
		}
		return false;
	}

	/**
	 * 函数功能说明：后台 修改景点信息
	 *
	 * @param 参数说明
	 * @return 返回值说明 jsp页面
	 * @throws 异常处理说明
	 * @author 创建人hanxl
	 * @date 创建日期2020.12.25
	 */
	public void updateScenic(TScenicBase tScenicBase, MultipartFile fScenicImg, TSysUser sessionSysUser) {
		// 判重 查询除了该ID以外的数据 有没有相同名称以及区域的景区信息
		// 因为修改的景区信息名称和区域可以不变 与原来相同
		List<TScenicBase> lstScenicBase = tScenicBaseRepository.findByScenicNameAndZoneID(tScenicBase.getScenicName(),
				tScenicBase.getZoneID(), tScenicBase.getScenicID());
		if (lstScenicBase.size() == 0) {
			// 定义一个新的实体类对象
			TScenicBase dbScenicBase = tScenicBaseRepository.findByScenicID(tScenicBase.getScenicID());
			// 1.定义上传的文件
			String localPath = path;
			if (fScenicImg != null) {
				// 2.获得文件名字
				String scenicName = fScenicImg.getOriginalFilename();

				// 3.上传
				String newScenicName = FileNameUtils.getFileName(scenicName);

				// 3.1 生成新的文件名
				String realScenicPath = localPath + "/" + newScenicName;

				// 3.2 保存文件
				File destPhoto = new File(realScenicPath);

				// 判断文件目目录是否存在,不存在则新建
				if (!destPhoto.getParentFile().exists()) {
					destPhoto.getParentFile().mkdir();
				}

				try {
					fScenicImg.transferTo(destPhoto);

				} catch (IllegalStateException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				dbScenicBase.setImgPath(newScenicName);
			}

			dbScenicBase.setScenicName(tScenicBase.getScenicName());
			dbScenicBase.setRate(tScenicBase.getRate());
			dbScenicBase.setContact(tScenicBase.getContact());
			dbScenicBase.setTel(tScenicBase.getTel());
			dbScenicBase.setZoneID(tScenicBase.getZoneID());
			dbScenicBase.setAddress(tScenicBase.getAddress());
			dbScenicBase.setIntro(tScenicBase.getIntro());
			dbScenicBase.setMemo(tScenicBase.getMemo());
			dbScenicBase.setModifyDate(new Date());
			dbScenicBase.setReviser(sessionSysUser.getUserName());

			tScenicBaseRepository.save(dbScenicBase);

		}
	}

	/**
	 * 函数功能说明：后台 删除景点信息
	 *
	 * @param 参数说明
	 * @return 返回值说明 jsp页面
	 * @throws 异常处理说明
	 * @author 创建人hanxl
	 * @date 创建日期2020.12.25
	 */
	public Map<String, Object> delScenicBase(String checkList) {
		String[] checklist = checkList.split(",");
		List<Integer> lstScenicID = new ArrayList<>();
		List<String> lstScenicName = new ArrayList<>();
		Map<String, Object> map = new HashMap<>();
		for (String str : checklist) {
			int iScenicID = Integer.parseInt(str);
			// 通过景区ID查询是否有订单信息包括预留和订单和取消的订单
			List<VScenicOrder> lstScenicOrder = vScenicOrderRepository.getByScenicID(iScenicID);
			if (lstScenicOrder.size() == 0) {
				lstScenicID.add(iScenicID);
				TScenicBase dbScenicBase = tScenicBaseRepository.findByScenicID(iScenicID);
				lstScenicName.add(dbScenicBase.getScenicName());
			}
		}
		map.put("lstScenicName", lstScenicName);
		// 通过景区ID查询所有计划ID
		List<Integer> lstScenicPlanID = tScenicPlanRepository.getBylstScenicID(lstScenicID);
		// 删除没有订单的景区计划再删除景区信息
		tScenicPlanRepository.delScenicPlan(lstScenicPlanID);
		tScenicBaseRepository.delScenicBase(lstScenicID);
		return map;
	}

	/**
	 * 函数功能说明：前台景点菜单显示信息
	 *
	 * @param 参数说明
	 * @return 返回值说明 jsp页面
	 * @throws 异常处理说明
	 * @author 创建人hanxl
	 * @param pageSize
	 * @param pageNumber
	 * @param iZoneID
	 * @param strScenicName
	 * @date 创建日期2020.12.25
	 */
	public List<VScenicBase> findBySearch(String pageNumber, String pageSize, List<Integer> lstScenicID, int iZoneID,
			String strScenicName) {
		int iPageSize = 0;
		int iTempPageNo = 0;
		if (strScenicName == null) {
			strScenicName = "";
		}
		if (pageNumber == null) {
			pageNumber = "1";
		}
		if (pageSize == null) {
			iPageSize = 20;
		} else {
			iPageSize = Integer.valueOf(pageSize);
			iTempPageNo = (Integer.valueOf(pageNumber) - 1) * iPageSize;
		}
		List<VScenicBase> lstScenicBase = vScenicBaseRepository.findBySearch(lstScenicID, iZoneID, strScenicName,
				iTempPageNo, iPageSize);
		return lstScenicBase;
	}

	/**
	 * 函数功能说明：前台景点菜单显示信息 分页
	 *
	 * @param 参数说明
	 * @return 返回值说明 jsp页面
	 * @throws 异常处理说明
	 * @author 创建人hanxl
	 * @param pageSize
	 * @param pageNumber
	 * @param iZoneID
	 * @param strScenicName
	 * @date 创建日期2021.01.14
	 */
	public HashMap<String, Integer> mapFrontScenicBase(String pageNumber, String pageSize, List<Integer> lstScenicID) {

		HashMap<String, Integer> mapPage = common.getPage(pageNumber, pageSize,
				vScenicBaseRepository.countSearch(lstScenicID));

		return mapPage;
	}

	/**
	 * 函数功能说明：前台首页景区模块显示
	 *
	 * @param 参数说明
	 * @return 返回值说明 jsp页面
	 * @throws 异常处理说明
	 * @author 创建人hanxl
	 * @param
	 * @param lstScenicID
	 * @date 创建日期2021.02.23
	 */
	public List<VScenicBase> findScenic(List<Integer> lstScenicID, int iZoneID) {
		// 查询该区对应的省且最近创建的线路的前8条信息
		List<VScenicBase> lstScenicBase = vScenicBaseRepository.findScenic(lstScenicID, iZoneID);
		return lstScenicBase;
	}
	
	/**
	  * @descr 景点级联选择器 
	  * @param iZoneID
	  * @return JSON
	  * @throws 
	  * @author liys
	  * @date 2021-6-18
	 */
	public String scenicSelect(int iZoneID) {
		
		List<Map<String,Object>> scenicList = scenicDao.getScenicsByZone(iZoneID);
		for (Map<String, Object> item : scenicList) {
			item.put("children", scenicDao.getPlansByBaseID((int) item.get("value")));
		}
		return JSONObject.toJSONString(scenicList);
	} 
}
